home *** CD-ROM | disk | FTP | other *** search
- // these macros get expanded on the host if the @1 army is AI controlled
-
- // Summary of node control AI approach is this:
- //
- // At startup, randomly pick one of these actions:
- // 1. send sarge and group 1 to nearest non-owned node to sarge, send group 2, 4 and 6 to
- // second nearest non-owned node to sarge and send group 3, 5 and 7 to third nearest
- // non-owned node.
- // 2. send sarge and group 1, 4, 5 to nearest non-owned node to sarge and send groups
- // 2, 3, 6, 7 to second closest non-owned node to sarge
- // 3. send sarge and all groups to nearest non-owned node to sarge
- // When choosing a new action, it depends on the number of nodes owned by my team plus
- // whether my team is winning the game.
- // Depending on these plus random calls we select one of above actions or one of the
- // following:
- // 4. send sarge and group1 to nearest non-owned node to sarge,
- // send group 2,4,6 to closest owned node to sarge,
- // send group 3,5,7 to second closest non-owned node to sarge
- // 5. send sarge and group1 to nearest non-owned node to sarge,
- // send group 2,4,6 to closest owned node to sarge,
- // send group 3,5,7 to second closest owned node to sarge
- // 6. send sarge and group1 to nearest owned node to sarge,
- // send group 2,4,6 to second closest owned node to sarge,
- // send group 3,5,7 to third closest owned node to sarge
- // 7. send sarge and group 1, 3, 5, 7 to nearest owned node to sarge,
- // send group 2,4,6 to second closest owned node to sarge,
- //
- // The rules for selecting amoung these actions are:
- // if we own no nodes then
- // randomly pick from 1, 2, 3
- // else if we own one node only then
- // randomly pick from 4, 1, 2, 3
- // else if we own two nodes and are winning then
- // randomly pick from 5, 4, 7
- // else if we own two nodes and are not winning then
- // randomly pick from 1, 2, 3, 4, 5
- // else if we own three nodes or more and are winning
- // pick action 6
- // else if we own three nodes or more and are not winning
- // pick option 5
-
- // @1 = color of army to do AI for, @2 = enemy color, @3 = enemy color number
- macro ai_score_compare_enemy 3
- {
- if @1check@2score testvar teamscore @2 >= @1winningScore and IsAlly @1 @2 = 0 then
- setvar @1winningScore teamscore @2,
- setvar @1winningColor @3
- }
-
- // @1 = color of army to do AI for, @2-4 = enemy colors
- macro ai_score_compare 4
- {
- // this variable is set to the winning score if @1 is not winning
- variable @1winningScore 0
-
- // this variable is set to the winning color (e.g. green, tan) if @1 is not winning
- variable @1winningColor 0
-
- expand ai_score_compare_enemy ( @1 @2 1 )
- expand ai_score_compare_enemy ( @1 @3 2 )
- expand ai_score_compare_enemy ( @1 @4 3 )
-
- if @1CalculateWinningTeam then
- setvar @1winningScore 0,
- setvar @1winningColor 0,
- trigger @1check@2score,
- trigger @1check@3score,
- trigger @1check@4score
- }
-
- // @1 = color of army to do AI for,
- // @2 = a node number, @3 = a group number
- macro node_ai_per_node_per_group 3
- {
- if @1GroupGotoNode testvar @1gotoNode = @2 and @1gotoGroup = @3 then
- order @1 group @3 goto @1node@2pad inmode defend
- }
-
- // @1 = color of army to do AI for,
- // @2 = a node number
- // @3 = owner number for this color
- macro node_ai_per_node 3
- {
- expand node_ai_per_node_per_group ( @1 @2 0 )
- expand node_ai_per_node_per_group ( @1 @2 1 )
- expand node_ai_per_node_per_group ( @1 @2 2 )
- expand node_ai_per_node_per_group ( @1 @2 3 )
- expand node_ai_per_node_per_group ( @1 @2 4 )
- expand node_ai_per_node_per_group ( @1 @2 5 )
- expand node_ai_per_node_per_group ( @1 @2 6 )
- expand node_ai_per_node_per_group ( @1 @2 7 )
-
- if @1SargeGotoNode testvar @1gotoNode = @2 then
- order @1sarge1 goto @1node@2pad inmode attack
-
- // if any node changes owner then reconsider our actions
- if node@2OwnerChanged then
- triggerdelay 200 @1ChooseNewAction
-
- // stuff for working out closest owned/non-owned nodes
- variable @1TeamOwnsNode@2 0
-
- if @1ClearTeamOwns then
- setvar @1TeamOwnsNode@2 0
-
- if @1CalcTeamOwns testvar node@2owner = @3 then
- setvar @1TeamOwnsNode@2 1
-
- if @1FindClosest1OwnedNode
- testvar @1TeamOwnsNode@2 = 1
- and @1Closest1OwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
- setvar @1Closest1OwnedNode @2,
- setvar @1Closest1OwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
-
- if @1FindClosest2OwnedNode
- testvar @1TeamOwnsNode@2 = 1
- and @2 <> @1Closest1OwnedNode
- and @1Closest2OwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
- setvar @1Closest2OwnedNode @2,
- setvar @1Closest2OwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
-
- if @1FindClosest3OwnedNode
- testvar @1TeamOwnsNode@2 = 1
- and @2 <> @1Closest1OwnedNode
- and @2 <> @1Closest2OwnedNode
- and @1Closest3OwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
- setvar @1Closest3OwnedNode @2,
- setvar @1Closest3OwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
-
- if @1FindClosest1NonOwnedNode
- testvar @1TeamOwnsNode@2 = 0
- and @1Closest1NonOwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
- setvar @1Closest1NonOwnedNode @2,
- setvar @1Closest1NonOwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
-
- if @1FindClosest2NonOwnedNode
- testvar @1TeamOwnsNode@2 = 0
- and @2 <> @1Closest1NonOwnedNode
- and @1Closest2NonOwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
- setvar @1Closest2NonOwnedNode @2,
- setvar @1Closest2NonOwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
-
- if @1FindClosest3NonOwnedNode
- testvar @1TeamOwnsNode@2 = 0
- and @2 <> @1Closest1NonOwnedNode
- and @2 <> @1Closest2NonOwnedNode
- and @1Closest3NonOwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
- setvar @1Closest3NonOwnedNode @2,
- setvar @1Closest3NonOwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
- }
-
- // @1 = color of army to do AI for, @2 = enemy color,
- // @3 = this colors owner number, @4 = enemy colors owner numbers
- // @5 = node number
- macro node_ai_per_enemy_per_node 5
- {
- if @1CalcTeamOwns testvar isAlly @1 @2 = 1 and node@5owner = @4 then
- setvar @1TeamOwnsNode@5 1
- }
-
- // @1 = color of army to do AI for, @2 = enemy color,
- // @3 = this colors owner number, @4 = enemy colors owner numbers
- // @5 = action number for attacking this enemy
- macro node_ai_per_enemy 5
- {
- expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 1 )
- expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 2 )
- expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 3 )
- expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 4 )
- expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 5 )
- }
-
- // @1 = color of army to do AI for, @2-@4 = other colors,
- // @5 = this colors owner number, @6-8 = other colors owner numbers
- macro node_ai_macro 8
- {
- expand ai_score_compare ( @1 @2 @3 @4 )
-
- // calculate the closest owned and unowned nodes
- variable @1Closest1OwnedNode 0
- variable @1Closest2OwnedNode 0
- variable @1Closest3OwnedNode 0
- variable @1Closest1NonOwnedNode 0
- variable @1Closest2NonOwnedNode 0
- variable @1Closest3NonOwnedNode 0
- variable @1Closest1OwnedNodeDist 10000
- variable @1Closest2OwnedNodeDist 10000
- variable @1Closest3OwnedNodeDist 10000
- variable @1Closest1NonOwnedNodeDist 10000
- variable @1Closest2NonOwnedNodeDist 10000
- variable @1Closest3NonOwnedNodeDist 10000
-
- if @1CalculateClosestNodes then
- trigger @1ClearTeamOwns,
- trigger @1CalcTeamOwns,
- setvar @1Closest1OwnedNode 0,
- setvar @1Closest2OwnedNode 0,
- setvar @1Closest3OwnedNode 0,
- setvar @1Closest1NonOwnedNode 0,
- setvar @1Closest2NonOwnedNode 0,
- setvar @1Closest3NonOwnedNode 0,
- setvar @1Closest1OwnedNodeDist 10000,
- setvar @1Closest2OwnedNodeDist 10000,
- setvar @1Closest3OwnedNodeDist 10000,
- setvar @1Closest1NonOwnedNodeDist 10000,
- setvar @1Closest2NonOwnedNodeDist 10000,
- setvar @1Closest3NonOwnedNodeDist 10000,
- trigger @1FindClosest1OwnedNode,
- trigger @1FindClosest2OwnedNode,
- trigger @1FindClosest3OwnedNode,
- trigger @1FindClosest1NonOwnedNode,
- trigger @1FindClosest2NonOwnedNode,
- trigger @1FindClosest3NonOwnedNode
-
- // This variable holds the current action for @1
- // 0 means no action, other actions are explained in header of this file
- variable @1Action 0
-
- variable @1gotoNode 0
- variable @1gotoGroup 0
-
- expand node_ai_per_node ( @1 1 @5 )
- expand node_ai_per_node ( @1 2 @5 )
- expand node_ai_per_node ( @1 3 @5 )
- expand node_ai_per_node ( @1 4 @5 )
- expand node_ai_per_node ( @1 5 @5 )
-
- expand node_ai_per_enemy ( @1 @2 @5 @6 4 )
- expand node_ai_per_enemy ( @1 @3 @5 @7 5 )
- expand node_ai_per_enemy ( @1 @4 @5 @8 6 )
-
- if startup1 then
- triggerdelay 1000 @1ChooseNewAction
-
- // events to choose an action based on who owns what and who is winning
-
- if @1ChooseNewAction then
- setvar @1Action 0,
- trigger @1CalculateWinningTeam,
- trigger @1ChooseAction,
- trigger @1PerformAction,
- trigger @1StartTimeOut
-
- if @1ChooseAction testvar @1nodesOwned = 0 then random
- setvar @1Action 1,
- setvar @1Action 2,
- setvar @1Action 3
-
- if @1ChooseAction testvar @1nodesOwned = 1 then random
- setvar @1Action 4,
- setvar @1Action 1,
- setvar @1Action 2,
- setvar @1Action 3
-
- if @1ChooseAction testvar @1nodesOwned = 2
- and @1winningscore < teamscore @1 then random
- setvar @1Action 4,
- setvar @1Action 5,
- setvar @1Action 6,
- setvar @1Action 7
-
- if @1ChooseAction testvar @1nodesOwned = 2
- and @1winningscore >= teamscore @1 then random
- setvar @1Action 1,
- setvar @1Action 2,
- setvar @1Action 3,
- setvar @1Action 4,
- setvar @1Action 5
-
- if @1ChooseAction testvar @1nodesOwned >= 3
- and @1winningscore < teamscore @1 then random
- setvar @1Action 6
-
- if @1ChooseAction testvar @1nodesOwned >= 3
- and @1winningscore >= teamscore @1 then random
- setvar @1Action 5
-
- // events to perform the chosen action
-
- if @1PerformAction testvar @1Action = 0 then
- triggerdelay 3000 @1ChooseNewAction
-
- if @1PerformAction testvar @1Action = 1 then
- trigger @1CalculateClosestNodes,
- // sarge and 1 to closest non-owned node
- setvar @1gotoNode @1Closest1NonOwnedNode,
- trigger @1SargeGotoNode,
- setvar @1gotoGroup 1,
- trigger @1GroupGotoNode,
- // 2, 4, 6 to second closest non-owned node
- setvar @1gotoNode @1Closest2NonOwnedNode,
- setvar @1gotoGroup 2,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 4,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 6,
- trigger @1GroupGotoNode,
- // 3, 5, 7 to third closest non-owned node
- setvar @1gotoNode @1Closest3NonOwnedNode,
- setvar @1gotoGroup 3,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 5,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 7,
- trigger @1GroupGotoNode
-
- if @1PerformAction testvar @1Action = 2 then
- trigger @1CalculateClosestNodes,
- // sarge and 1, 4, 5 to closest non-owned node
- setvar @1gotoNode @1Closest1NonOwnedNode,
- trigger @1SargeGotoNode,
- setvar @1gotoGroup 1,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 4,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 5,
- trigger @1GroupGotoNode,
- // 2, 3, 6, 7 to second closest non-owned node
- setvar @1gotoNode @1Closest2NonOwnedNode,
- setvar @1gotoGroup 2,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 3,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 6,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 7,
- trigger @1GroupGotoNode
-
- if @1PerformAction testvar @1Action = 3 then
- trigger @1CalculateClosestNodes,
- // sarge and 1, 2, 3, 4, 5, 6, 7 to closest non-owned node
- setvar @1gotoNode @1Closest1NonOwnedNode,
- trigger @1SargeGotoNode,
- setvar @1gotoGroup 1,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 2,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 3,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 4,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 5,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 6,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 7,
- trigger @1GroupGotoNode
-
- if @1PerformAction testvar @1Action = 4 then
- trigger @1CalculateClosestNodes,
- // sarge and 1 to closest non-owned node
- setvar @1gotoNode @1Closest1NonOwnedNode,
- trigger @1SargeGotoNode,
- setvar @1gotoGroup 1,
- trigger @1GroupGotoNode,
- // 2, 4, 6 to closest owned node
- setvar @1gotoNode @1Closest1OwnedNode,
- setvar @1gotoGroup 2,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 4,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 6,
- trigger @1GroupGotoNode,
- // 3, 5, 7 to second closest non-owned node
- setvar @1gotoNode @1Closest2NonOwnedNode,
- setvar @1gotoGroup 3,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 5,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 7,
- trigger @1GroupGotoNode
-
- if @1PerformAction testvar @1Action = 5 then
- trigger @1CalculateClosestNodes,
- // sarge and 1 to closest non-owned node
- setvar @1gotoNode @1Closest1NonOwnedNode,
- trigger @1SargeGotoNode,
- setvar @1gotoGroup 1,
- trigger @1GroupGotoNode,
- // 2, 4, 6 to closest owned node
- setvar @1gotoNode @1Closest1OwnedNode,
- setvar @1gotoGroup 2,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 4,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 6,
- trigger @1GroupGotoNode,
- // 3, 5, 7 to second closest owned node
- setvar @1gotoNode @1Closest2OwnedNode,
- setvar @1gotoGroup 3,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 5,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 7,
- trigger @1GroupGotoNode
-
- if @1PerformAction testvar @1Action = 6 then
- trigger @1CalculateClosestNodes,
- // sarge and 1 to closest owned node
- setvar @1gotoNode @1Closest1OwnedNode,
- trigger @1SargeGotoNode,
- setvar @1gotoGroup 1,
- trigger @1GroupGotoNode,
- // 2, 4, 6 to second closest owned node
- setvar @1gotoNode @1Closest2OwnedNode,
- setvar @1gotoGroup 2,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 4,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 6,
- trigger @1GroupGotoNode,
- // 3, 5, 7 to third closest owned node
- setvar @1gotoNode @1Closest3OwnedNode,
- setvar @1gotoGroup 3,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 5,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 7,
- trigger @1GroupGotoNode
-
- if @1PerformAction testvar @1Action = 7 then
- trigger @1CalculateClosestNodes,
- // sarge and 1 , 3, 5, 7 to closest owned node
- setvar @1gotoNode @1Closest1OwnedNode,
- trigger @1SargeGotoNode,
- setvar @1gotoGroup 1,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 3,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 5,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 7,
- trigger @1GroupGotoNode,
- // 2, 4, 6 to second closest owned node
- setvar @1gotoNode @1Closest2OwnedNode,
- setvar @1gotoGroup 2,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 4,
- trigger @1GroupGotoNode,
- setvar @1gotoGroup 6,
- trigger @1GroupGotoNode,
-
- // timeout code - if mode has not changed for a while then change it
-
- variable @1TimeOutVar 0
- variable @1LastTimeOutVar 1
-
- if @1StartTimeOut then
- addvar @1TimeOutVar 1,
- triggerdelay 120000 @1CheckTimeOut
-
- if @1CheckTimeOut testvar @1TimeOutVar = @1LastTimeOutVar then
- trigger @1ChooseNewAction
-
- if @1CheckTimeOut testvar @1TimeOutVar <> @1LastTimeOutVar then
- addvar @1LastTimeOutVar 1
- }